export function initialUpdateQueue(fiber) {
  const queue = {
    baseState: fiber.memoizedState, //本次更新前该Fiber节点的state,Update基于该state计算更新后的state
    firstBaseUpdate: null, //本次更新前该Fiber节点已保存的Update链表头
    lastBaseUpdate: null, //本次更新前该Fiber节点已保存的Update链表尾
    shared: {
      //触发更新时，产生的Update会保存在shared.pending中形成单向环状链表
      //当由Update计算state时这个环会被剪开并连接在lastBaseUpdate后面
      pending: null,
    },
  };
  fiber.updateQueue = queue;
}

let fiber = {
  memoizedState: {
    id: 1,
  },
};

function createUpdate() {
  return {};
}
function enqueueUpdate(fiber, update) {
  const updateQueue = fiber.updateQueue;
  const shared = updateQueue.shared;
  const pending = shared.pending;
  if (pending === null) {
    update.next = update;
  } else {
    // 如果更新队列不为空 取出第一个更新
    update.next = pending.next;
    //   然后让原来队列指向最新的更新
    pending.next = update;
  }
  uodate.shared.pending = update;
}

function processUpdateQueue(fiber) {
  const queue = fiber.updateQueue;
  const pending = queue.shared.pending;
  if (pending !== null) {
    queue.shared.pending = null;
    // 最后一个更新
    const lastPendingUpdate = pending;
    const firstPendingUpdate = lastPendingUpdate.next;
    // 断环
    lastPendingUpdate.next = null;
    let newState = fiber.memoizedState;
    let update = firstPendingUpdate;
    while (update !== null) {
      newState = getStateFromUpdate(update, newState);
      update = update.next;
    }
    fiber.memoizedState = newState;
  }
}
function getStateFromUpdate(update, state) {
  return Object.assign({}, state, update.payload);
}

initialUpdateQueue(fiber);
let update = createUpdate();
update.payload = {
  name: "update1",
};
enqueueUpdate(fiber, update);
let update2 = createUpdate();
update.payload = {
  name: "update2",
  age: "update age2",
};
enqueueUpdate(fiber, update2);

processUpdateQueue(fiber);
console.log(fiber.memoizedState);
